package com.mall.malladminbackend.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.mall.malladminbackend.dto.SysDeptDto;
import com.mall.malladminbackend.entity.SysDept;
import com.mall.malladminbackend.mapper.SysDeptMapper;
import com.mall.malladminbackend.model.R;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.security.Principal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * 2022/8/11
 * 一杯茶，一根烟，一个bug解一天
 */
@Service
@AllArgsConstructor
@Transactional
public class SysDeptService {

       private SysDeptMapper  sysDeptMapper;

//       查询
       public R getSysDeptTree(){
           return R.buildSuccess(sysDeptMapper.getSysDeptTree(0));
       }
//       添加
      public R addSysDept(SysDeptDto sysDeptDto, Principal principal){
           if (sysDeptDto!=null&&!"".equals(sysDeptDto)){
               sysDeptDto.setCreateBy(principal.getName());
               sysDeptDto.setCreateTime(new Date());
               return R.buildSuccess(sysDeptMapper.addSysDept(sysDeptDto));
           }
            return R.buildFailure(0,"添加失败");
      }

//      编辑
      public  R updateDept(SysDeptDto sysDeptDto,Principal principal){
           if (sysDeptDto!=null && !"".equals(sysDeptDto)){
               sysDeptDto.setCreateBy(principal.getName());
               sysDeptDto.setCreateTime(new Date());
               return R.buildSuccess(sysDeptMapper.updateDept(sysDeptDto));
           }
            return  R.buildFailure(0,"添加失败");
      }


//      删除
      public   R  deleteDept(long id){
           List<Long> childDeptIds = new ArrayList<>();
          //集合里面已经装入了所有子公司的id
           udelete(id,childDeptIds);
          //将母公司的id,
           childDeptIds.add(id);
          int i = sysDeptMapper.deleteBatchIds(childDeptIds);
          if(i>0){
              return  R.buildSuccess(1,"删除成功");
          }
        return  R.buildFailure(0,"删除失败");
      }
      public  void udelete(long id,List<Long> childDeptId) {
          QueryWrapper<SysDept> qw = new QueryWrapper<>();
          qw.eq("parent_id",id);
          qw.select("id");
          // 这里得到的是母公司下的所有子公司实体类
          List<SysDept> sysDepts = sysDeptMapper.selectList(qw);
          //将上一添加到句代码中的查询出来的所有子公司的实体类中的id添加到childDeptId这个集合中
          sysDepts.stream().forEach( e -> {
              childDeptId.add(e.getId());
              udelete(e.getId(),childDeptId);
          });
      }
}
